home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / win / pascal / clover.exe / CLOVER.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  1991-08-17  |  2.9 KB  |  109 lines

  1. {$N-} {Much Better with $N+}
  2. Program Clover;
  3.  
  4. Uses WinProcs, WinTypes, WObjects;
  5.  
  6. Type
  7.     PCloverWnd = ^TCloverWnd;
  8.     TCloverWnd = Object(TWindow)
  9.        cxClient,
  10.        cyClient        : Word;
  11.        hRgnClip        : hRgn;
  12.  
  13.         Constructor Init(AParent : PWindowsObject; ATitle : PChar);
  14.         Procedure WMDestroy(Var Msg : TMessage);
  15.           Virtual wm_First + wm_Destroy;
  16.         Procedure WMSize(Var Msg : TMessage);
  17.           Virtual wm_First + wm_Size;
  18.         Procedure Paint(PaintDC : hDC;
  19.              Var PaintInfo : TPaintStruct); Virtual;
  20.     End;
  21.  
  22.     TCloverApp = Object(TApplication)
  23.         Procedure InitMainWindow; Virtual;
  24.     End;
  25.  
  26. Constructor TCloverWnd.Init(AParent :PWindowsObject; ATitle : PChar);
  27.  
  28. Begin
  29.     TWindow.Init(AParent, ATitle);
  30. End;
  31.  
  32. Procedure TCloverWnd.WMDestroy(Var Msg : TMessage);
  33. Begin
  34.     DeleteObject(hRgnClip);
  35.     TWindow.WMDestroy(Msg);
  36. End;
  37.  
  38. Procedure TCloverWnd.WMSize(Var Msg : TMessage);
  39. Var
  40.     I             : ShortInt;
  41.     WaitCursor    : hCursor;
  42.     hRgnTemp    : Array[0..5] of hRgn;
  43.  
  44. Begin
  45.     cxClient := LoWord(Msg.lParam);
  46.     cyClient := HiWord(Msg.lParam);
  47. {
  48.     WaitCursor := SetCursor(LoadCursor(0, IDC_Wait));
  49.     ShowCursor(True);
  50. }
  51.     If (hRgnClip <> 0) Then DeleteObject(hRgnClip);
  52.     hRgnTemp[0] := CreateEllipticRgn(0, cyClient div 3,
  53.                     cxClient div 2, 2 * cyClient div 3);
  54.     hRgnTemp[1] := CreateEllipticRgn(cxClient div 2, cyClient div 3,
  55.                     cxClient, 2 * cyClient div 3);
  56.     hRgnTemp[2] := CreateEllipticRgn(cxClient div 3, 0,
  57.                     2 * cxClient div 3, cyClient div 2);
  58.     hRgnTemp[3] := CreateEllipticRgn(cxClient div 3, cyClient div 2,
  59.                     2 * cxClient div 3, cyClient);
  60.     hRgnTemp[4] := CreateRectRgn(0, 0, 1, 1);
  61.     hRgnTemp[5] := CreateRectRgn(0, 0, 1, 1);
  62.     hRgnClip    := CreateRectRgn(0, 0, 1, 1);
  63.  
  64.     CombineRgn(hRgnTemp[4], hRgnTemp[0], hRgnTemp[1], Rgn_Or);
  65.     CombineRgn(hRgnTemp[5], hRgnTemp[2], hRgnTemp[3], Rgn_Or);
  66.     CombineRgn(hRgnClip, hRgnTemp[4], hRgnTemp[5], Rgn_XOr);
  67.  
  68.     For I := 0 to 5 do
  69.         DeleteObject(hRgnTemp[I]);
  70. {
  71.     SetCursor(hCursor);
  72.     ShowCursor(False);
  73. }
  74. {
  75.     TWindow.WMSize(Msg);
  76. }
  77. End;
  78.  
  79. Procedure TCloverWnd.Paint(PaintDC : hDC; Var PaintInfo : TPaintStruct);
  80. Var
  81.     I             : Integer;
  82.     fAngle,
  83.     fRadius        : Real;
  84.  
  85. Begin
  86.     SetViewPortOrg(PaintDC, cxClient div 2, cyClient div 2);
  87.     SelectClipRgn(PaintDC, hRgnClip);
  88.     fRadius := Sqrt(Sqr(CxClient/2) + Sqr(cyClient/2));
  89.     For I := 1 to 360 do
  90.     Begin
  91.         fAngle := fAngle + ((2*Pi)/360);
  92.         MoveTo(PaintDC, 0,0);
  93.         LineTo(PaintDC, Integer(Round(fRadius * Cos(fAngle) + 0.5)),
  94.                 Integer(Round(-fRadius * Sin(fAngle) + 0.5)));
  95.     End;
  96. End;
  97.  
  98. Procedure TCloverApp.InitMainWindow;
  99. Begin
  100.     MainWindow := New(PCloverWnd, Init(Nil, 'Draw A Clover'));
  101. End;
  102.  
  103. Var CloverApp : TCloverApp;
  104.  
  105. Begin
  106.     CloverApp.Init('Clover');
  107.     CloverApp.Run;
  108.     CloverApp.Done;
  109. End.